1 线性表课后编程题
01.从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删元素的值。空出的位置由最后一个元素填补,若顺序表为空,则显示出错信息并退出运行。
typedef int datatype
typedef struct node_st{
	datatype *data;
	int last;
}sqlist;
datatype sqlist_mindel(sqlist *L){
	if(L->last==0)
		return -1;
	datatype data;
	data = L->data[0];
	int pos = 0,i;
	for(i=1;i<L->last;i++){
		if(L->data[i]<data){
			data = L->data[i];
			pos = i;
		}
	}
	L->data[pos]=L->data[L->last-1]; //顺序表末尾减一
	L->last--;
	return data;
}
01.设计一个递归算法,删除不带头结点的单链表L中所有值为×的结点
typedef int datatype;
typedef struct node_st{
	typedef *data;
	struct node_st *next;
}llist;
bool del_x(llist* L,datatype data){
	if(L==NULL)
		return true;
	if(L->data==data){
		llist *tmp;
		tmp = L;
		L=L->next;
		free(tmp);
		del_x(L,datatype data);
	}else{
		del_x(L->next,datatype data);
	}
}
02.设置一个高效的算法,将顺序表L的所有元素逆置,算法复杂度O(1)
typedef int datatype
typedef struct node_st{
	datatype *data;
	int last;
}sqlist;
void reverse(sqlist *L){
	datatype tmp;
	for(int i =0;i<L->last/2;i++){
		tmp=L->data[i];
		L->data[i]=L->data[L->last-i-1];
		L->data[L->last-i-1]=tmp;
	}
}
03.带头节点的点链表L中,删除所有值为X的节点,X不唯一
typedef int datatype;
typedef struct node_st{
	datatype data;
	struct node_st *next;
}llist;
int del_x(llist *L,datatype data){
	struct llist *p = L,*tmp;
	while(p->next!=NULL){
		if((p->next)->data==data){
			tmp=p->next;
			p->next=tmp->next;
			free(tmp);
			p=p->next;
		}
		p=p->next;
	}
	return 0;
}
04、设L是带头节点的单链表,反向输出值

typedef int datatype;
typedef struct node_st{
	datatype data;
	struct node_st *next;
}llist;
void reversel(llist*L){
	llist *prev,*cur=L->next,*next;
	while(cur!=NULL){
		next = cur->next;
		cur->next=prev;
		prev=cur;
		cur=next;
	}
	while(prev!=null){
		printf("%d->",prev->data);
		prev=prev->next;
	}
}
05.对长度为n的顺序表L,编写一个时间复杂度为O(n)、空间复杂度为0(1)的算法,该算法删除线性表中所有值为x的数据元素
typedef int datatype
typedef struct node_st{
	datatype *data;
	int last;
}sqlist;
//k是记录不等于data的值的
void del_x(sqlist *L,datatype data){
	int k=0,i;
	for(i=0;i<L.last;i++){
		if(L->data[i]!=data){
			L->data[k]=L->data[i];
			k++;
		}
	}
	L->last=k;
}